package com.mapbased.wfw.handler;

import java.io.*;
import java.util.*;
import javax.imageio.*;
import javax.servlet.http.*;

import java.awt.*;
import java.awt.image.*;

import com.mapbased.wfw.*;

/**
 * <p>Title: </p>
 *
 * <p>Description:generate a code resp in image.
 *
 *  </p>
 *
 * <p>Copyright: Copyright (c) 2004</p>
 *
 * <p>Company: mapbased.com</p>
 *
 * @author chy_hs(Baily)
 * @version 1.0
 */
public class ImgCodeGenerator
    extends PageHandler
{
    public static final String SESSION_VERIFYCODE="VerifyCode";

    /**
     *
     * @param context RenderContext
     * @todo Implement this com.mapbased.wfw.PageHandler method
     */
    public Object dispatchAction(RenderContext ctx)
    {
        HttpServletResponse response=ctx.getResponse();
        HttpSession session=ctx.getRequest().getSession();
        response.setHeader("Pragma","No-cache");
        response.setHeader("Cache-Control","no-cache");
        response.setDateHeader("Expires",0);

        int width=60,height=20;
        BufferedImage image=new BufferedImage(width,height,
                                              BufferedImage.TYPE_INT_RGB);

        Graphics g=image.getGraphics();
        Random random=new Random();

        g.setColor(getRandColor(200,250));
        g.fillRect(0,0,width,height);

        // g.setFont();

        g.setColor(getRandColor(160,200));
        for(int i=0;i < 15;i++)
        {
            int x=random.nextInt(width);
            int y=random.nextInt(height);
            int xl=random.nextInt(12);
            int yl=random.nextInt(12);
            g.drawLine(x,y,x + xl,y + yl);
        }

        StringBuffer sb=new StringBuffer(4);
        for(int i=0;i < 4;i++)
        {
            String rand=String.valueOf(random.nextInt(10));
            sb.append(rand);

            g.setXORMode(new Color(20 + random.nextInt(110),
                                   20 + random.nextInt(110),
                                   20 + random.nextInt(110)));
            g.drawString(rand,13 * i + 6,16);
        }
        String sRand=sb.toString();
        session.setAttribute(SESSION_VERIFYCODE,sRand);

        g.dispose();

        try
        {
            ImageIO.write(image,"JPEG",response.getOutputStream());
        }
        catch(IOException ex)
        {
            // ex.printStackTrace();
        }
        return ExitException.instance;

    }

//   static final ExitException EXIT_EXCEPTION=new com.mapbased.wfw.ExitException();

private    Color getRandColor(int fc,int bc)
    {
        Random random=new Random();
        if(fc > 255)
        {
            fc=255;
        }
        if(bc > 255)
        {
            bc=255;
        }
        int r=fc + random.nextInt(bc - fc);
        int g=fc + random.nextInt(bc - fc);
        int b=fc + random.nextInt(bc - fc);
        return new Color(r,g,b);
    }
}
